/**
 * @Author: zhongyang
 * @Date: 2022/6/24 17:47
 */

package main

import (
	"fmt"
	"sync"
)

/**
04_单例模式
概念：该类负责创建自己的对象，同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式，可以直接访问，不需要实例化该类的对象。
目的：保证一个类仅有一个实例，并提供一个访问它的全局访问点。
可分为懒汉式和饿汉式：
	懒汉式：当getInstance方法被调用时创建。
	饿汉式：当程序运行时就直接创建。
这里只展示懒汉式。
*/

type SingleData struct {
	data interface{}
}

var data *SingleData
var once sync.Once // 可通过这个来实现安全的单例模式
var wg sync.WaitGroup

func getInstance(i int) *SingleData {
	once.Do(func() {
		data = &SingleData{i}
	})
	return data
}

func main() {
	i1 := getInstance(1)
	i2 := getInstance(2)
	if i1 == i2 {
		fmt.Println("单例")
	} else {
		fmt.Println("不是单例")
	}
}
